<?php
declare(strict_types=1);

namespace Zms\Sn;

class Sn
{
    /**
     * 生成订单SN,基础长度13位字符串，13位长度可以保证1秒1000次生成不重复
     * @param int $dilution 稀释订单号，增加位数防止重复
     * @return string
     */
    public static function gen(int $dilution = 0): string
    {
        $el = array_merge(range(1, 9), range('A', 'Z'));

        $elMaxIndex = count($el) - 1;

        //SN单号
        $sn = '';

        //年份因子，可以用35年
        $sn .= $el[intval(date("Y") - 2024)];
        //月份因子
        $sn .= $el[intval(date("m"))];
        //日期因子
        $sn .= $el[intval(date("d"))];
        //小时因子
        $sn .= $el[intval(date("H"))];
        //分数因子
        $sn .= date("i");
        //秒数因子
        $sn .= date("s");

        //补充随机数
        for ($i = 0; $i < 5 + $dilution; $i++) {
            $sn .= $el[rand(0, $elMaxIndex)];
        }
        return $sn;
    }
}